package com.example.sinoyd.frameapplication.KotlinFrame.Uitl

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.widget.LinearLayout
import android.widget.TextView
import com.baidu.location.BDLocation
import com.baidu.location.BDLocationListener
import com.baidu.location.LocationClient
import com.baidu.location.LocationClientOption
import com.baidu.mapapi.map.*
import com.baidu.mapapi.model.LatLng
import com.example.sinoyd.frameapplication.KotlinFrame.Mode.Measuringpoints
import com.example.sinoyd.frameapplication.R

/**
 * 作者： scj
 * 创建时间： 2018/5/23
 * 版权： 江苏远大信息股份有限公司
 * 描述： com.example.sinoyd.frameapplication.KotlinFrame.Uitl
 *
 * 百度地图控制类
 *
 */

class BaiduMapControl(var con: Context, var mapView: com.baidu.mapapi.map.MapView) : BaiduMap.OnMarkerClickListener {

    var BaiduMap = mapView.map
    //定位自己的位置
    var mLocationClient: LocationClient? = null
    var isFirstLocate = true
    //当前设备所在位置
    var startPt: LatLng? = null
    //图钉
    var option: OverlayOptions? = null
    //图钉图片
    var bd = BitmapDescriptorFactory.fromResource(R.drawable.air1)
    //小图标
    var marker: Marker? = null

    init {
        //获取定位权限
        Getpermission.requestPermission(con as Activity)
        mapView.removeViewAt(1)//移除百度图标
        mapView.showZoomControls(false)//移除缩放控件
        BaiduMap!!.isMyLocationEnabled = true
    }

    //开始定位自己
    fun requestLocation() {
        mLocationClient = LocationClient(con.applicationContext)
        mLocationClient!!.registerLocationListener(MyLocationListener())
        //设置定位的一些设置
        val option = LocationClientOption()
        option.setScanSpan(5000)//表示每5秒更新一下当前位置
        option.setIsNeedAddress(true)
        option.locationMode = LocationClientOption.LocationMode.Hight_Accuracy
        // Hight_Accuracy表示高精确度模式，会在GPS信号正常的情况下优先使用GPS定位，在无法接收GPS信号的时候使用网络定位。
        // Battery_Saving表示节电模式，只会使用网络进行定位。
        // Device_Sensors表示传感器模式，只会使用GPS进行定位。
        mLocationClient!!.locOption = option
        //启动定位
        Log.i("scj", "开始定位自己")
        mLocationClient!!.start()
    }

    //显示本人位置
    private fun navigateTo(location: BDLocation) {
        startPt = LatLng(location.latitude, location.longitude)
        if (isFirstLocate) {
            val ll = LatLng(location.latitude, location.longitude)//LatLng类用于存放经纬度
            // 第一个参数是纬度值，第二个参数是精度值。这里输入的是本地位置。
            var update = MapStatusUpdateFactory.newLatLng(ll)//将LatLng对象传入
            BaiduMap!!.animateMapStatus(update)
            update = MapStatusUpdateFactory.zoomTo(10f)//百度地图缩放范围，限定在3-19之间，可以去小数点位值
            // 值越大，地图显示的信息越精细
            BaiduMap!!.animateMapStatus(update)
            isFirstLocate = false//防止多次调用animateMapStatus()方法，以为将地图移动到我们当前位置只需在程序
            // 第一次定位的时候调用一次就可以了。
        }
        val locationBuilder = MyLocationData.Builder()
        locationBuilder.latitude(location.latitude)
        locationBuilder.longitude(location.longitude)
        val locationData = locationBuilder.build()
        BaiduMap!!.setMyLocationData(locationData)//获取我们的当地位置
        moveBaidumap(location.latitude, location.longitude)
    }

    //地图根据某个点为中心移动地图
    public fun moveBaidumap(lat: Double, long: Double) {
        val mMapStatus = MapStatus.Builder()
                .target(LatLng(lat, long))//嘉兴市的经纬度
                .zoom(12f)
                .build()
        //定义MapStatusUpdate对象，以便描述地图状态将要发生的变化
        val mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus)
        //改变地图状态
        BaiduMap!!.setMapStatus(mMapStatusUpdate)
    }

    //定位当前位置的监听时间
    inner class MyLocationListener : BDLocationListener {

        override fun onReceiveLocation(location: BDLocation) {
            Log.i("scj", "当前位置${location.latitude}")
            Log.i("scj", "当前位置${location.longitude}")
            if (location.locType == BDLocation.TypeGpsLocation || location.locType == BDLocation.TypeNetWorkLocation) {
                navigateTo(location)
                if (mLocationClient!!.isStarted) {
                    // 获得位置之后停止定位
                    mLocationClient!!.stop()
                }
            }
        }

        fun onConnectHotSpotMessage(s: String, i: Int) {
            Log.i("scj", s)
            Log.i("scj", i.toString() + "")
        }
    }

    //显示站点图钉
    public fun initOverlay(list: List<Measuringpoints>) {
        // add marker overlay
        var point: LatLng? = null
        for (item in list) {
            point = LatLng(item.lat, item.lon)
            //图钉图片
            option = MarkerOptions().position(point).icon(bd)
            //新建一个Marker
            marker = (BaiduMap!!.addOverlay(option)) as Marker
            //动画
            //val oo = MarkerOptions().position(point).icon(bd).perspective(false).anchor(0.5f, 0.5f).rotate(30f).zIndex(7)
            //oo.animateType(MarkerOptions.MarkerAnimateType.grow)
            //传参数过去  小图标显示的所有参数
            var bundle = Bundle()
            bundle.putSerializable("info", item)
            bundle.putString("key", item.name)
            marker!!.extraInfo = bundle
        }
        //移动地图
//        moveBaidumap(121.387466, 31.115627)
    }

    //点击Marker的监听事件
    override fun onMarkerClick(p0: Marker?): Boolean {
        //获取上面传过来的数据
        val info = p0!!.extraInfo.get("info") as Measuringpoints
        val key = p0!!.extraInfo.get("key") as Measuringpoints


        val bubbleLayout = LayoutInflater.from(con).inflate(R.layout.marker_layout, mapView, false) as LinearLayout
        var tv1 = bubbleLayout.findViewById<TextView>(R.id.marker_name)
        var tv2 = bubbleLayout.findViewById<TextView>(R.id.tv_2_1)


        tv1.text = info.name
        var pt = LatLng(info.lat, info.lon)
        //创建InfoWindow , 传入 view， 地理坐标， y 轴偏移量
        var mInfoWindow = InfoWindow(bubbleLayout, pt, 0)
        //显示InfoWindow
        BaiduMap!!.showInfoWindow(mInfoWindow)


        return false
    }


}

